滿一周了,還有三周能堅持住嗎?
前面講的布林、數字、字串屬於基本型別(Primitive Type),
而陣列跟往後講的函式跟物件屬於參考型別(Reference Type)
拿個例子來看兩種的差異
let strA = '早';
let strB = strA;
strA = '晚';
console.log(strB); //早
let arrA = [1, 2, 3];
let arrB = arrA;
arrA[0] = 100;
console.log(arrB); // [100, 2, 3]
基本型別的變數內容是值,當字串B=字串A時會copy一份到自己變數內(參考以下糞繪圖)
當字串A的值被改變時,字串B的內容不會改變。
然後是參考型別,此是變數內的內容不是陣列,而是一個指向陣列在記憶體中位置的參考
陣列B=陣列A時,copy的內容是記憶體位置,而改變陣列時陣列A跟陣列B都會改變。
let arrA = [1, 2, 3];
let arrB = arrA;
arrA = [4, 5, 6];
console.log(arrB); // [1, 2, 3]
但如果將陣列A指向新的陣列,陣列B還是指向原本的[1, 2, 3]
陣列
當想要將兩個陣列合成一個時,可以直接將兩個陣列相加嗎?
let arrA = [1, 2, 3];
let arrB = [4, 5, 6];
let arrC = arrA + arrB;
console.log(arrC); //1,2,34,5,6 嗯?
console.log(typeof arrC); //string
答案是不行,兩個陣列被強制轉型成字串後拼起來了
要拼接陣列時使用concat()
方法來作,會將括號內的內容加入陣列
let arrA = [1, 2, 3];
let arrB = [4, 5, 6];
let arrC = arrA.concat(arrB);
console.log(arrC); //[1, 2, 3 ,4 ,5 ,6]
//也可以一次串接多個內容
let arrD = [];
console.log(arrD.concat(0, arrA, arrB, 7, 8)); //[0 ,1, 2, 3 ,4 ,5 ,6 ,7 ,8 ]
ES6後新增了一個展開運算子(...) 可以把陣列內容展開成多個參數
串接陣列有更簡單的實作方式
let arrA = [1, 2, 3];
let arrB = [4, 5, 6];
let arrC = [...arrA, ...arrB];
console.log(arrC);//[1, 2, 3 ,4 ,5 ,6]
尋找陣列內是否有特定的值,提供方法有三種
includes(值)
:陣列內含有值的話回傳true
,否則回傳false
indexOf(值)
:回傳值在陣列內第一個出現的位置索引值,如果沒有則回傳-1lastIndexOf(值)
:回傳值在陣列內最後一個出現的位置索引值,如果沒有則回傳-1三種方法可以看情況來選擇使用
let arrA = [1, 2, 3, 4, 1, 5, 6];
console.log(arrA.includes(5)); //true
console.log(arrA.includes(9)); //false
console.log(arrA.indexOf(1)); //0
console.log(arrA.indexOf(9)); //-1
console.log(arrA.lastIndexOf(1)); //4
直接調用reverse()
方法就可以了,簡單方便,
要注意的是跟上面的方法不同,reverse()
會直接改變原陣列的內容
let arrA = [1, 2, 3, 4, 5];
console.log(arrA.reverse()); //[5, 4, 3, 2, 1]
console.log(arrA);//[5, 4, 3, 2, 1]
slice()
跟splice()
兩個方法名字很像,要小心搞混
slice()
方法能把陣列部分的內容拷貝一份出來splice()
方法則是把特定部分切除
let arrA = [1, 2, 3, 4, 5];
//slice()
arrB = arrA.slice(2); //把索引2以後的內容拷貝
console.log(arrB); //[3, 4, 5]
console.log(arrA); // [1, 2, 3, 4, 5]
arrC = arrA.slice(1, 4); //可以指定結束位置
console.log(arrC); //[2, 3, 4]
//splice()
arrA.splice(1, 2); //從索引1開始 切除兩個內容
console.log(arrA); //[1, 4, 5]
arrA = [1, 2, 3, 4, 5];
arrA.splice(2, 2, '三', '四'); //另可以在切除的位置加入新的內容
console.log(arrA); //[1, 2, "三", "四", 5]
上面提到陣列是參考類型不能直接複製,如果想把陣列copy一份副本
可以用slice()
方法跟展開運算子來實作
let arrA = [1, 2, 3, 4, 5];
let arrB = arrA.slice(); //不給索引值,可以直接拷貝一份給B
let arrC = [...arrA]; //或著用展開運算子
arrA[0] = 100;//改變陣列的內容
console.log(arrA); //[100, 2, 3, 4, 5]
console.log(arrB); //[1, 2, 3, 4, 5]
console.log(arrC); //[1, 2, 3, 4, 5]
//此時改變A的內容也不會影響B跟C了
其實還有一些常用的方法沒介紹,像是map()
跟reduce()
但這些方法都會使用到函式(還沒介紹囧),看等函式介紹完後在此篇更新。
或是之後再發一篇(下),再這篇名稱改成(中)